AWS SDK for Javaを使う#Amazon SNS
はじめに
いまやクラウドサービスの代表格とも言えるAmazonですが、EC2やS3をはじめとして、さまざまなサービスを提供しています。数年前に私も少しだけEC2やS3を使用したことがあるのですが、最近はあまりさわっていませんでした。 しかし今回AWSについての調査をきっかけに、各種AWSサービスについて復習&AWS SDKでの動作確認をしていきたいと思います。
今回はいろいろなプロトコルで通知を行うことができるサービス、Amazon SNSです。
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.2
- Java : 1.6.0_26
- Scala : 2.9.1 final
- SBT : 0.11.2
なお、AWSへの登録は終わっているものとします。
Amazon SNS
Amazon Simple Notification Service (Amazon SNS) は、クラウドからの通知を簡単に実現するためのサービスです。 このサービスはアプリケーションからメッセージを発行し、直ちに受信者またはその他のアプリケーションに伝えることが可能です。 以前ご紹介したAmazon SQSは、メッセージをputした後ポーリングでキューの監視をする必要がありましたが、これは任意のトピックをsubscribeしておくだけでメッセージをプッシュ形式で受信可能です。 また、受信するメッセージの形式は、http(https)、email、Amazon SQSなどを使用することが可能です。
今回はAmazon SNSを用いて、メッセージ受信と送信をおこなってみましょう。
実行環境のセットアップ
以前と同じくsbt + scala + aws-sdk-javaをセットアップしておきましょう。
Amazon SNSサンプル作成
今回はemailで通知を行います。まずはトピックを作成して subscribeするクラスを作成します。 src/main/scalaディレクトリに、SnsSub.scalaファイルを作成してください。 ここではトピックの作成とemailでのsubscribe登録を行なっています。
import com.amazonaws.auth.BasicAWSCredentials import com.amazonaws.services.sns.AmazonSNSClient import com.amazonaws.services.sns.model.CreateTopicRequest import com.amazonaws.services.sns.model.CreateTopicResult import com.amazonaws.services.sns.model.SubscribeRequest import com.amazonaws.services.sns.model.PublishRequest import scala.collection.JavaConversions._ object SnsSubscribe extends App{ // アクセスキー val accessKey = "アクセスキー" // シークレットキー val secretKey = "シークレットキー" val credentials = new BasicAWSCredentials(accessKey,secretKey) val sns = new AmazonSNSClient(credentials) val topic = new CreateTopicRequest("MyTopic") val res = sns.createTopic(topic) val arn = res.getTopicArn(); println("arf=" + arn); val subscribeRequest = new SubscribeRequest() subscribeRequest.setTopicArn(arn) //通知プロトコルはemailを選択.endpointは通知先emailアドレス subscribeRequest.setProtocol("email"); subscribeRequest.setEndpoint("通知したいメールアドレス"); sns.subscribe(subscribeRequest); }
SnsSub.scalaではemailで通知を受け取るようにSubscribeRequestを設定しています。 setEndpointには通知をしたいメールアドレスを指定してください。 記述ができたらsbtを起動してトピックを作成します。出力されたarnを覚えておいてください、 また、この時点でAWS Management ConsoleでAmazon SNSを確認してみると、トピックとSubscriptionsが登録されているのがわかります。
$ sbt >run
次にメッセージをpublishするSnsPub.scalaを作成します。PublishRequestのコンストラクタに、先程確認したarnを指定します。
import com.amazonaws.auth.BasicAWSCredentials import com.amazonaws.services.sns.AmazonSNSClient import com.amazonaws.services.sns.model.CreateTopicRequest import com.amazonaws.services.sns.model.CreateTopicResult import com.amazonaws.services.sns.model.SubscribeRequest import com.amazonaws.services.sns.model.PublishRequest import scala.collection.JavaConversions._ object SnsPublish extends App{ // アクセスキー val accessKey = "アクセスキー" // シークレットキー val secretKey = "シークレットキー" val credentials = new BasicAWSCredentials(accessKey,secretKey) val sns = new AmazonSNSClient(credentials) val publishRequest = new PublishRequest("確認したarn","MyTopic") publishRequest.setMessage("publish message!"); sns.publish(publishRequest); }
PublishRequestにメッセージをセットし、publishメソッドを呼ぶと、指定したarnをsubscribeしているクライアントに対してメールが送信されます。 こちらのクラスも実行してください。設定したメッセージと共にメールがくるはずです。
まとめ
今回はemailでの通知サービスを使用してみました。 Amazon SNSではemail以外でもhttpやAmazon SQSを使用して通知することもできます。 とくにSQSの場合、httpやemail等と違って料金がかからないので検討してみてください。
参考サイトなど
- AWS SDK for Java javadoc: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/
- Amazon SNS公式ドキュメントリンク: http://aws.amazon.com/jp/documentation/sns/